#ifndef __MCL51_H__
#define __MCL51_H__ 

#ifndef __SDCC 
#define __SDCC
#endif 

#ifdef __SDCC 
#define SFR(reg, addr) __sfr __at(addr) reg
#define SBIT(reg, addr) __sbit __at(addr) reg
#define interrupt __interrupt
#define bit __bit  
// #define _nop_() __asm NOP __endasm
#define _nop_() \
	__asm     \
	nop   \
	__endasm 
#else//Keil
#define SFR(reg, addr) sfr reg = addr
#define SBIT(reg, addr) sbit reg = addr

#endif //End of __SDCC


SFR(DPL		    ,0x82) ;
SFR(DPH		    ,0x83) ;
SFR(P0			,0x80) ;
SFR(P1			,0x90) ;
SFR(P2			,0xA0) ;
SFR(P3			,0xB0) ;
SFR(P4			,0xC0) ;
SFR(P5			,0xC8) ;
SFR(P6			,0xE8) ;
SFR(P7			,0xF8) ;
SFR(IE			,0xA8) ;  // 中断使能寄存器, IE[7] 为全局中断使能位

SFR(PXYDI        ,0XC0) ; // 扩展外设数据输入
SFR(PXYDO        ,0XC1) ; // 扩展外设数据输出
SFR(PXYAD        ,0XC2) ; // 扩展外设地址

SFR(IS           ,0XA9) ; // 中断源 0 ~ 15 



// 向自定义外设写数据
#define PXY_WR(addr,data) do { \
	PXYAD = addr ; \
    PXYDO = data ; \
} while(0)

#define PXY_RD(addr) (PXYAD=addr,PXYDI)

typedef __xdata unsigned char   BYTE  ;
typedef __xdata unsigned char   u8  ;
typedef __xdata unsigned int    u16 ;
typedef __xdata unsigned long   u32 ;

typedef __xdata  char   i8  ;
typedef __xdata  int    i16 ;
typedef __xdata  long   i32 ;

typedef  unsigned char   uint8_t  ;
typedef  unsigned int    uint16_t ;
typedef  unsigned long   uint32_t ;
 
typedef           char   int8_t   ;
typedef           int    int16_t  ;
typedef           long   int32_t  ;


// MCL 51中断注册，生成hex后使用isr.sh来修正入口地址 
// 例如: INT_REGISTER(2,0x0000) ,后面需要实现2号中断的函数，如下所示
// void isr2(void) {
//     P0 = P0 + 2;
//      __asm  reti __endasm ; // 中断执行完成，返回并使能中断
// }

#define INT_REGISTER(id,isrAddr) \
    __code char __at(0x10*2 + id*2) isr##id##_entry[2]={isrAddr>>8 , isrAddr&0xff} ;\
    void isr##id(void) ;

#endif 

